#include <stdio.h>
#include <unistd.h>

#include "ohos_init.h"
#include "cmsis_os2.h"
#include "leftApp.h"

struct CONTROL_DATA control_data = {0, 0, 0, 0, 0, 0, 0, 0};
struct ADC_PACK adc_pack = {0, 0, 0, 0, 0, 0};
hi_u8 right_buffer[20];

hi_u32 uart_init(hi_uart_idx HI_UART_IDX) {
    
    hi_u32 ret ;
    if (HI_UART_IDX == HI_UART_IDX_2) {
        hi_io_set_func(HI_IO_NAME_GPIO_11, HI_IO_FUNC_GPIO_11_UART2_TXD);
        hi_io_set_func(HI_IO_NAME_GPIO_12, HI_IO_FUNC_GPIO_12_UART2_RXD);
    }
    else if (HI_UART_IDX == HI_UART_IDX_1) {
        hi_io_set_func(HI_IO_NAME_GPIO_5, HI_IO_FUNC_GPIO_5_UART1_RXD);
        hi_io_set_func(HI_IO_NAME_GPIO_6, HI_IO_FUNC_GPIO_6_UART1_TXD);
    }

    hi_uart_attribute cfg = {
        .baud_rate = 115200, 
        .data_bits = 8,      
        .stop_bits = 1,
        .parity = 0,
    };

    ret = hi_uart_init(HI_UART_IDX, &cfg, HI_NULL);
    if(ret != HI_ERR_SUCCESS) {
        printf("uart%d init failed\r\n", HI_UART_IDX);
    }
    return ret;
}

hi_u32 adc_init() {
    hi_u32 ret;
    
    hi_io_set_func(HI_IO_NAME_GPIO_4, HI_IO_FUNC_GPIO_4_GPIO); // adc1  scl
    ret = hi_gpio_set_dir(HI_GPIO_IDX_4, HI_GPIO_DIR_IN);
    if (ret != HI_ERR_SUCCESS) {
        printf("adc1 init failed\r\n ");
        return ret;
    }
    else {
        printf("adc1 init success\r\n");
    }

    hi_io_set_func(HI_IO_NAME_GPIO_7, HI_IO_FUNC_GPIO_7_GPIO); // adc3  MISO
    ret = hi_gpio_set_dir(HI_GPIO_IDX_7, HI_GPIO_DIR_IN);
    if (ret != HI_ERR_SUCCESS) {
        printf("adc3 init failed\r\n ");
        return ret;
    }
    else {
        printf("adc3 init success\r\n");
    }

    hi_io_set_func(HI_IO_NAME_GPIO_9, HI_IO_FUNC_GPIO_9_GPIO); // adc4  A9
    ret = hi_gpio_set_dir(HI_IO_NAME_GPIO_9, HI_GPIO_DIR_IN);
    if (ret != HI_ERR_SUCCESS) {
        printf("adc4 init failed\r\n ");
        return ret;
    }
    else {
        printf("adc4 init success\r\n");
    }

}

hi_u16 adc_read(hi_adc_channel_index HI_ADC_CHANNEL_IDX) {
    hi_u32 ret;
    hi_u16 data, temp_data[64], vlt;
    float voltage, vlt_max, vlt_min;

    ret = hi_adc_read((hi_adc_channel_index)HI_ADC_CHANNEL_IDX, &data, HI_ADC_EQU_MODEL_4, HI_ADC_CUR_BAIS_DEFAULT, 0);
    if (ret != HI_ERR_SUCCESS) {
        printf("ADC%d Read Fail\n", HI_ADC_CHANNEL_IDX);
        return -9.99;
    }

    return data;
}

hi_void parse_adc_data() {
    if(adc_pack.left_sw < 200) control_data.left_sw = 0;
    else control_data.left_sw = 1;
    
    if (adc_pack.left_x > 1500) control_data.left_x = 1;
    else control_data.left_x = 0;

    if (adc_pack.left_y > 1500) control_data.left_y = 1;
    else control_data.left_y = 0;

    control_data.right_sw  = right_buffer[3];
    control_data.right_y  = right_buffer[2];
    control_data.right_x  = right_buffer[1];
}

hi_void leftApp() 
{
    hi_u32 ret;
    hi_u8 pic_state = 0, speak_state = 0;
    
    ret = hi_gpio_init();   
    if (ret != HI_ERR_SUCCESS) printf("init gpio failed ret = %u", ret);
    
    ret = adc_init();
    if (ret != HI_ERR_SUCCESS) printf("init adc failed ret = %u", ret);

    ret = uart_init(HI_UART_IDX_1);
    if (ret != HI_ERR_SUCCESS) printf("init uart1 failed ret = %u", ret);

    ret = uart_init(HI_UART_IDX_2);
    if (ret != HI_ERR_SUCCESS) printf("init uart2 failed ret = %u", ret);

    while (1)
    {
        hi_u8 idx_p = 0;
        memset(right_buffer, 0, 20);

        adc_pack.left_x = adc_read(HI_ADC_CHANNEL_1); // adc1  scl  x
        usleep(100000);
        adc_pack.left_y = adc_read(HI_ADC_CHANNEL_3);  // adc3  MISO y
        usleep(100000);     
        adc_pack.left_sw = adc_read(HI_ADC_CHANNEL_4); // adc4  A9   sw
        usleep(100000);
        
        while (1)
        {
            hi_u8 tempdata;
            hi_uart_read(HI_UART_IDX_2, tempdata, 1);
            if(idx_p != 0 && right_buffer[0] != 'r') continue;
            if (tempdata == 'e') break;
            right_buffer[idx_p ++] = tempdata;
        }

        parse_adc_data();
        hi_u8 tmp_buffer[10];  // 3 + 3 + 2
        sprintf(tmp_buffer, "s%d%d%d%d%d%de", control_data.left_x, control_data.left_y, \
            control_data.left_sw, control_data.right_x, control_data.right_y, control_data.right_sw);
        hi_uart_write(HI_UART_IDX_1, tmp_buffer, 8);
        //printf("adc_x = %d, adc_y = %d, adc_sw = %d\r\n", adc_l_x, adc_l_y, adc_l_sw);   
    }
    
}

SYS_RUN(leftApp);

 